#include "printf.h"
#include "console.h"
#include "types.h"
#include "memory.h"
#include "pmm.h"    // 添加物理内存管理头文件
#include "vm.h"     // 添加虚拟内存管理头文件
#include "kalloc.h"
#include "panic.h"
#include "test.h"
// 外部符号声明
extern void uart_init(void);
extern void uart_putc(char c);
extern void uart_puts(const char *s);
extern char etext[], edata[], end[];

// 主函数
void main(void) {
    // 初始化UART（最小系统可能不需要复杂初始化）
    uart_init();
    console_clear(); 
    // 初始化内存管理
    pmm_init();
    
    // 初始化页表并启用虚拟内存
    kvminit();
    kvminithart();
    
    // 测试输出
    printf("Hello OS!\n");
    // 输出启动信息
    uart_puts("\nHello OS\n");
   // printf("Test: %d %s 0x%x\n", -42, "OK", 0xABC);
    //printf("Testing integer: %d\n", 42);
   // printf("Testing negative: %d\n", -123);
    //printf("Testing zero: %d\n", 0);
    //printf("Testing hex: 0x%x\n", 0xABC);
    //printf("Testing string: %s\n", "Hello");
    //printf("Testing char: %c\n", 'X');
   // printf("Testing percent: %%\n");
    // printf("etext=%p, edata=%p, end=%p\n", etext, edata, end);
    
    // 测试内存分配
    //void *page1 = alloc_page();
   // void *page2 = alloc_page();
    //printf("Allocated pages: %p, %p\n", page1, page2);
    //free_page(page1);
    //free_page(page2);
    
    printf("Memory Test:\n");
void *p1 = kalloc();
void *p2 = kalloc();
if(!p1 || !p2) {
    printf("Allocation failed!\n");
    panic("kalloc error");
}

printf("Alloc: %p, %p\n", p1, p2);  // 使用%p格式符
kfree(p1);
kfree(p2);
void *p3 = kalloc();
printf("Realloc: %p (expect %p)\n", p3, p1);
printf("Test Passed\n");
    
 run_all_tests();  

    
    // 主循环
    while (1) {
        // 简单系统可以在这里添加更多功能
        // 或者保持空循环
    }
}
